package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 18:37
 **/
public class CAS {
    public static void main(String[] args) {
        /**
         * CAS的原理
         * ===》 CAS叫做CompareAndSwap，比较并交换;
         *
         * 主要是通过处理器的指令来保证操作的原子性，它包含
         * 1. 变量内存地址，V表示;
         * 2. 旧的预期值，A表示;
         * 3. 准备设置的新值，B表示;
         * ===>
         * 当执行CAS指令时，只有当V等于A时，才会用B去更新V的值，否则就不会执行更新操作。
         *
         * 总结 ：
         * 利用处理器指令，对于CAS操作进行封装，使得CAS操作为原子性操作;
         */

        /**
         * CAS的缺点 ：
         * ===》
         * 1.ABA问题 ：
         * （1）ABA问题详述 ：
         * ABA的问题指的是在CAS更新的过程中，当读取到的值是A，然后准备赋值的时候仍然是A，
         * 但是实际上有可能A的值被改成了B，然后又被改回了A，这个CAS更新的漏洞就叫做ABA。
         * 只是ABA的问题大部分场景下都不影响并发的最终效果。
         * ===》 即，在CAS操作过程中，所要操作的值被修改过，但是却仍然执行该CAS操作;
         *
         * （2）解决ABA问题 ：
         * Java中有AtomicStampedReference来解决这个问题，
         * 加入了预期标志和更新后标志两个字段，更新时不光检查值，还要检查当前的标志是否等于预期标志，全部相等的话才会更新。
         * ===》 即，为解决ABA问题，降入预期标志和更新后标志，若是更新前后不一致的话，即代表发生了ABA问题;
         *
         * 2.循环时间长开销大：
         * 自旋CAS的方式如果长时间不成功，会给CPU带来很大的开销。
         *
         * 3.只能保证一个共享变量的原子操作：
         * 只对一个共享变量操作可以保证原子性，但是多个则不行，多个可以通过AtomicReference来处理或者使用锁synchronized实现。
         *
         */
    }
}
